package br.com.petsis.funcionalidades.consultarProntuarios;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Cliente;
import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.FormaPagamento;
import br.com.petsis.entity.Funcionario;
import br.com.petsis.entity.Pet;
import br.com.petsis.entity.Prontuario;
import br.com.petsis.entity.Usuario;

@Name("consultarProntuariosController")
@Scope(ScopeType.CONVERSATION)
public class ConsultarProntuariosController {
	
	private static final String QRY_PRONTUARIOS = "select p.id_prontuario,p.id_pet,p.id_cliente,p.dta_atendimento,p.flg_pago,p.id_forma_pagamento,p.vlr_atendimento from prontuario p where p.flg_ativo = 'T'";
	private static final String QRY_CLIENTES = "select c.id_cliente,c.dsc_nome from cliente c where c.flg_ativo = 'T' and c.id_empresa = :idEmpresa order by c.dsc_nome";
	private static final String QRY_PETS = "select p.id_pet,p.dsc_nome from pet p where p.flg_ativo = 'T' and p.id_cliente = :idCliente order by p.dsc_nome";
	private static final String QRY_FORMAS_PAGAMENTO = "select f.id_forma_pagamento,f.dsc_forma_pagamento from forma_pagamento f where f.flg_ativo = 'T' order by f.dsc_forma_pagamento";
	private static final String QRY_FUNCIONARIOS = "select f.id_funcionario,f.dsc_nome from funcionario f where f.flg_ativo = 'T' and f.id_empresa = :idEmpresa order by f.dsc_nome";

	@In(create=true)
	private EntityManager entityManager;
	
	private List<Prontuario> listaProntuarios;
	
	private List<SelectItem> listaClientes;
	
	private List<SelectItem> listaFormasPagamento;
	
	private List<SelectItem> listaPets;
	
	private List<SelectItem> listaFuncionarios;
	
	private Prontuario prontuarioConsulta;
	
	private Float valorTotal;
	
	private Date dtaInicio;
	
	private Date dtaFim;
	
	@In(required=false)
    private Empresa empresaSessao;
	
	@In
	private Usuario usuarioLogado;
	
	public void onLoad(){
		setListaProntuarios(null);
		setListaClientes(null);
		setProntuarioConsulta(null);
		setValorTotal(null);
		if(usuarioLogado != null && usuarioLogado.getCliente() != null){
//			getPacoteConsulta().setCliente(usuarioLogado.getCliente());
		}
	}
	
	public Date getDtaInicio() {
		return dtaInicio;
	}

	public void setDtaInicio(Date dtaInicio) {
		this.dtaInicio = dtaInicio;
	}

	public Date getDtaFim() {
		return dtaFim;
	}

	public void setDtaFim(Date dtaFim) {
		this.dtaFim = dtaFim;
	}

	public void pesquisar(){
		if(empresaSessao == null){
		}
		
		StringBuffer query = new StringBuffer(QRY_PRONTUARIOS);
		
		if(getProntuarioConsulta().getCliente().getIdCliente() != null){
			query.append(" and p.id_cliente = :idCliente");
		}
		
		if(getDtaInicio() != null){
			query.append(" and p.dta_atendimento >= :dtaInicio");
		}
		
		if(getDtaFim() != null){
			query.append(" and p.dta_atendimento <= :dtaFim");
		}
		
		if(getProntuarioConsulta().getFormaPagamento().getIdFormaPagamento() != null){
			query.append(" and p.id_forma_pagamento = :idFormaPagamento");
		}
		
		if(getProntuarioConsulta().getFuncionario().getIdFuncionario() != null){
			query.append(" and p.id_funcionario = :idFuncionario");
		}
		
		if(getProntuarioConsulta().getPet().getIdPet() != null){
			query.append(" and p.id_pet = :idPet");
		}
		
		if(getProntuarioConsulta().getFlgRetorno() != null){
			query.append(" and p.flg_retorno = :retorno");
		}
			
		if(empresaSessao != null){
			query.append(" and p.id_empresa = :idEmpresa");
		}
		
		query.append(" ORDER BY p.dta_atendimento DESC");
		
		Query qryResult = entityManager.createNativeQuery(query.toString());
		
		if(getProntuarioConsulta().getCliente().getIdCliente() != null){
			qryResult.setParameter("idCliente", getProntuarioConsulta().getCliente().getIdCliente());
		}
		
		if(getDtaInicio() != null){
			qryResult.setParameter("dtaInicio", getDtaInicio());
		}
		
		if(getDtaFim() != null){
			qryResult.setParameter("dtaFim", getDtaFim());
		}
		
		if(getProntuarioConsulta().getFormaPagamento().getIdFormaPagamento() != null){
			qryResult.setParameter("idFormaPagamento", getProntuarioConsulta().getFormaPagamento().getIdFormaPagamento());
		}
		
		if(getProntuarioConsulta().getFuncionario().getIdFuncionario() != null){
			qryResult.setParameter("idFuncionario", getProntuarioConsulta().getFuncionario().getIdFuncionario());
		}
		
		if(getProntuarioConsulta().getPet().getIdPet() != null){
			qryResult.setParameter("idPet", getProntuarioConsulta().getPet().getIdPet());
		}
		
		if(getProntuarioConsulta().getFlgRetorno() != null){
			qryResult.setParameter("retorno", getProntuarioConsulta().getFlgRetorno());
		}
			
		if(empresaSessao != null){
			query.append(" and p.id_empresa = :idEmpresa");
			qryResult.setParameter("idEmpresa", empresaSessao.getIdEmpresa());
		}
		
		List<Object[]> lista = qryResult.getResultList();
		setListaProntuarios(null);

		/*p.id_prontuario,0
		 * p.id_pet,1
		 * p.id_cliente,2
		 * p.dta_atendimento,3
		 * p.flg_pago,4
		 * p.id_forma_pagamento,5*/
		
		Float valorTotal = 0F;
		if(lista == null || lista.size() == 0){
			FacesMessages.instance().add(Severity.ERROR,"Nenhum registro encontrado.");
		}else{
			Prontuario p;
			for(Object[] o : lista){
				p = new Prontuario();
				p.setIdProntuario(Integer.parseInt(o[0].toString()));
				p.setCliente(recuperaNomeCliente(o[2]));
				p.setPet(recuperaNomePet(o[1]));
				p.setDtaAtendimento((Date)o[3]);
				p.setFlgPago((Character)o[4]);
				p.setFormaPagamento(recuperaNomeFormaPagamento(o[5]));
				p.setVlrAtendimento(Float.parseFloat(o[6].toString()));
				valorTotal += p.getVlrAtendimento();
				getListaProntuarios().add(p);
			}
			setValorTotal(valorTotal);
			FacesMessages.instance().add(Severity.INFO,"Foram encontrados "+listaProntuarios.size()+" registros.");
		}
	}
	
	public Cliente recuperaNomeCliente(Object id){
		if(id == null){
			return new Cliente();
		}
		try {
			Object retorno = entityManager.createNativeQuery("select c.dsc_nome from cliente c where c.id_cliente = :id ")
				.setParameter("id", id)
				.getSingleResult();
			if(retorno != null){
				Cliente c = new Cliente();
				c.setIdCliente(Integer.parseInt(id.toString()));
				c.setDscNome(retorno.toString());
				return c;
			}else{
				return new Cliente();
			}
		} catch (NoResultException e) {
			return new Cliente();
		}
	}
	
	public Pet recuperaNomePet(Object id){
		if(id == null){
			return new Pet();
		}
		try {
			Object retorno = entityManager.createNativeQuery("select c.dsc_nome from pet c where c.id_pet = :id ")
				.setParameter("id", id)
				.getSingleResult();
			if(retorno != null){
				Pet c = new Pet();
				c.setIdPet(Integer.parseInt(id.toString()));
				c.setDscNome(retorno.toString());
				return c;
			}else{
				return new Pet();
			}
		} catch (NoResultException e) {
			return new Pet();
		}
	}
	
	public FormaPagamento recuperaNomeFormaPagamento(Object id){
		if(id == null){
			return new FormaPagamento();
		}
		try {
			Object retorno = entityManager.createNativeQuery("select c.dsc_forma_pagamento from forma_pagamento c where c.id_forma_pagamento = :id ")
				.setParameter("id", id)
				.getSingleResult();
			if(retorno != null){
				FormaPagamento c = new FormaPagamento();
				c.setIdFormaPagamento(Integer.parseInt(id.toString()));
				c.setDscFormaPagamento(retorno.toString());
				return c;
			}else{
				return new FormaPagamento();
			}
		} catch (NoResultException e) {
			return new FormaPagamento();
		}
	}

	public List<SelectItem> getListaClientes() {
		if (listaClientes == null) {
			listaClientes = new ArrayList<SelectItem>();
			listaClientes.add(new SelectItem(null,"Selecione"));
			if(empresaSessao != null){
				List<Object[]> lista = entityManager.createNativeQuery(QRY_CLIENTES)
					.setParameter("idEmpresa", empresaSessao.getIdEmpresa())
					.getResultList();
				for(Object[] c : lista){
					listaClientes.add(new SelectItem(Integer.parseInt(c[0].toString()),
							c[1].toString()));
				}
			}
		}
		return listaClientes;
	}

	public void setListaClientes(List<SelectItem> listaClientes) {
		this.listaClientes = listaClientes;
	}

	public List<SelectItem> getListaFormasPagamento() {
		if (listaFormasPagamento == null) {
			listaFormasPagamento = new ArrayList<SelectItem>();
			listaFormasPagamento.add(new SelectItem(null,"Todas"));
			List<Object[]> lista = entityManager.createNativeQuery(QRY_FORMAS_PAGAMENTO)
				.getResultList();
			for(Object[] f : lista){
				listaFormasPagamento.add(new SelectItem(Integer.parseInt(f[0].toString()),
						f[1].toString()));
			}
		}
		return listaFormasPagamento;
	}

	public void setListaFormasPagamento(List<SelectItem> listaFormasPagamento) {
		this.listaFormasPagamento = listaFormasPagamento;
	}

	public Float getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(Float valorTotal) {
		this.valorTotal = valorTotal;
	}

	public List<Prontuario> getListaProntuarios() {
		if (listaProntuarios == null) {
			listaProntuarios = new ArrayList<Prontuario>();
		}
		return listaProntuarios;
	}

	public void setListaProntuarios(List<Prontuario> listaProntuarios) {
		this.listaProntuarios = listaProntuarios;
	}

	public List<SelectItem> getListaPets() {
		listaPets = new ArrayList<SelectItem>();
		listaPets.add(new SelectItem(null,"Selecione"));
		if(getProntuarioConsulta().getCliente().getIdCliente() != null){
			List<Object[]> lista = entityManager.createNativeQuery(QRY_PETS)
				.setParameter("idCliente", getProntuarioConsulta().getCliente().getIdCliente())
				.getResultList();
			for(Object[] o : lista){
				listaPets.add(new SelectItem(Integer.parseInt(o[0].toString()),
						o[1].toString()));
			}
		}
		return listaPets;
	}

	public void setListaPets(List<SelectItem> listaPets) {
		this.listaPets = listaPets;
	}

	public List<SelectItem> getListaFuncionarios() {
		if (listaFuncionarios == null) {
			listaFuncionarios = new ArrayList<SelectItem>();
			listaFuncionarios.add(new SelectItem(null,"Selecione"));
			if(empresaSessao != null){
				List<Object[]> lista = entityManager.createNativeQuery(QRY_FUNCIONARIOS)
					.setParameter("idEmpresa", empresaSessao.getIdEmpresa())
					.getResultList();
				for(Object[] o : lista){
					listaFuncionarios.add(new SelectItem(Integer.parseInt(o[0].toString()),
							o[1].toString()));
				}
			}
		}
		return listaFuncionarios;
	}

	public void setListaFuncionarios(List<SelectItem> listaFuncionarios) {
		this.listaFuncionarios = listaFuncionarios;
	}

	public Prontuario getProntuarioConsulta() {
		if (prontuarioConsulta == null) {
			prontuarioConsulta = new Prontuario();
			prontuarioConsulta.setCliente(new Cliente());
			prontuarioConsulta.setPet(new Pet());
			prontuarioConsulta.setFuncionario(new Funcionario());
			prontuarioConsulta.setFormaPagamento(new FormaPagamento());
		}

		return prontuarioConsulta;
	}

	public void setProntuarioConsulta(Prontuario prontuarioConsulta) {
		this.prontuarioConsulta = prontuarioConsulta;
	}
	
}
